package net.xdclass.component;

import com.alibaba.fastjson.JSON;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import lombok.extern.slf4j.Slf4j;
import net.xdclass.config.AlipayConfig;
import net.xdclass.config.PayUrlConfig;
import net.xdclass.enums.BizCodeEnum;
import net.xdclass.enums.ClientType;
import net.xdclass.exception.BizException;
import net.xdclass.vo.PayInfoVO;
import org.aspectj.weaver.ast.Var;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @author : zhen.xue
 * @date : 2021-07-06 22:16
 */
@Slf4j
@Service
public class AlipayStrategy implements PayStrategy{

    @Autowired
    private PayUrlConfig payUrlConfig;

    @Override
    public String unifiedOrder(PayInfoVO payInfoVO) {
        Map<String,String> content = new HashMap<>();
        //商户订单号,64个字符以内、可包含字母、数字、下划线；需保证在商户端不重复
        String no = UUID.randomUUID().toString();
        log.info("订单号:{}",no);
        content.put("out_trade_no", payInfoVO.getOutTradeNo());
        content.put("product_code", "FAST_INSTANT_TRADE_PAY");
        //订单总金额，单位为元，精确到小数点后两位
        content.put("total_amount", payInfoVO.getPayFee().toString());
        //商品标题/交易标题/订单标题/订单关键字等。 注意：不可使用特殊字符，如 /，=，&amp; 等。
        content.put("subject", payInfoVO.getTitle());
        //商品描述，可空
        content.put("body", payInfoVO.getDescription());
        double timeout = Math.floor(payInfoVO.getOrderPayTimeoutMills()/(1000*60));
        // 前端也需要判断是否快要过期了
        if(timeout<1){
            throw new BizException(BizCodeEnum.PAY_ORDER_PAY_TIMEOUT);
        }
        // 该笔订单允许的最晚付款时间，逾期将关闭交易。取值范围：1m～15d。m-分钟，h-小时，d-天，1c-当天（1c-当天的情况下，无论交易何时创建，都在0点关闭）。 该参数数值不接受小数点， 如 1.5h，可转换为 90m。
        content.put("timeout_express", Double.valueOf(timeout).intValue()+"m");
        String clientType = payInfoVO.getClientType();
        String form = "";

        try {
            if(clientType.equalsIgnoreCase(ClientType.H5.name())){
                AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
                request.setBizContent(JSON.toJSONString(content));
                request.setNotifyUrl(payUrlConfig.getAlipayCallbackUrl());
                request.setReturnUrl(payUrlConfig.getAlipaySuccessReturnUrl());
                AlipayClient instance = AlipayConfig.getInstance();
                AlipayTradeWapPayResponse payResponse = instance.pageExecute(request);
                if(payResponse.isSuccess()){
                    log.info("响应日志 payResponse = {}",payResponse);
                    form = payResponse.getBody();
                }else{
                    log.error("支付宝构H5建表单失败：response ={}，payinfo = {}",payResponse,payInfoVO);
                }
            }else if(clientType.equalsIgnoreCase(ClientType.PC.name())){
                AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
                request.setBizContent(JSON.toJSONString(content));
                request.setNotifyUrl(payUrlConfig.getAlipayCallbackUrl());
                request.setReturnUrl(payUrlConfig.getAlipaySuccessReturnUrl());
                AlipayClient instance = AlipayConfig.getInstance();
                AlipayTradePagePayResponse payResponse = instance.pageExecute(request);
                if(payResponse.isSuccess()){
                    log.info("响应日志 payResponse = {}",payResponse);
                    form = payResponse.getBody();
                }else{
                    log.error("支付宝构PC建表单失败：response ={}，payinfo = {}",payResponse,payInfoVO);
                }
            }else if(clientType.equalsIgnoreCase(ClientType.APP.name())){

            }
        }catch (AlipayApiException e){
            log.error("支付宝构H5建表单失败：payinfo = {},异常={}",payInfoVO,e);
        }

        return form;
    }

    @Override
    public String refound(PayInfoVO payInfoVO) {
        return null;
    }

    @Override
    public String queryPaySuccess(PayInfoVO payInfoVO) {
        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
        Map<String,String> content= new HashMap<>();
        // 订单商户号
        content.put("out_trade_no",payInfoVO.getOutTradeNo());
        request.setBizContent(JSON.toJSONString(content));
        AlipayTradeQueryResponse queryResponse = null;
        try {
             queryResponse = AlipayConfig.getInstance().execute(request);
            log.info("订单查询响应：{}",queryResponse.getBody());
        } catch (AlipayApiException e) {
            log.error("支付宝订单查询异常",e);
        }
        if(queryResponse != null && queryResponse.isSuccess()){
            log.info("支付宝订单状态查询成功：{}",payInfoVO);
            return queryResponse.getTradeStatus();
        }
        log.error("支付宝订单状态查询失败:{}",payInfoVO);
        return "";
    }
}